package br.ufpb.di.ppgi.negocio.modelo.usuario;

import java.util.Set;

import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;
import br.com.simtecnologia.access.controll.DefaultLoginSession;
import br.com.simtecnologia.access.controll.role.AbstractRoleLogin;
import br.com.simtecnologia.access.controll.role.RoleResolver;
import br.ufpb.di.ppgi.negocio.servicos.login.Credencial;

@Component
@SessionScoped
public class UsuarioSessionInfo extends AbstractRoleLogin implements IUsuario,DefaultLoginSession {
	private static final long serialVersionUID = 4261003705676153014L;
	private static final Logger LOGGER = LoggerFactory.getLogger(UsuarioSessionInfo.class);	

	private Usuario usuario;
	private boolean loggedIn = false;
	private final String sessionId;
	private int trys;
	
	public UsuarioSessionInfo(HttpSession session,RoleResolver resolver) {
		super(resolver);
		this.sessionId = session.getId();
	}
	
	public String getSessionId() {
		return sessionId; 
	}

	@Override
	public Long getId() {
		return isLogged() ? getUsuario().getId() : null;
	}	

	@Override
	public String getEmail() {
		return isLogged() ? getUsuario().getEmail() : null; 
	}
	
	@Override
	public UsuarioRole getRole() {
		return isLogged() ? getUsuario().getRole() : null;
	}
	
	@Override
	public Set<String> getRoles() {
		return isLogged() ? getUsuario().getRoles() : null;
	}	

	@Override
	public boolean confirmaSenha(String senha) {
		return isLogged() ? getUsuario().confirmaSenha(senha) : false;
	}

	@Override
	public boolean confirmaSenha(Credencial credential) {
		return isLogged() ? getUsuario().confirmaSenha(credential) : false;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Usuario getUsuario() {
		return usuario;
	}
	
	public boolean isLogged() {
		return loggedIn;
	}

	public void logout() {
		usuario = null;
		loggedIn = false;
	}
	
	@Override
	public String toString() {
		if (isLogged())
			return String.format("UsuarioSessionInfo [sessionId=%s, login=%s]", sessionId, usuario);
		else
			return String.format("UsuarioSessionInfo [sessionId=%s, logged off]", sessionId);
	}
	
	private void validLogin(Usuario usuario) {
		if (usuario == null)
			return;
		
		trys = 0;
		this.usuario = usuario;
		loggedIn = true;
		super.login(usuario.getRoles());
		LOGGER.debug("Usuário logado %s", this);
	}

	public boolean login(Usuario usuario) {
		logout();
		trys++;
		if (usuario != null)
			validLogin(usuario);
		return isLogged();
	}

	public boolean hasRole(UsuarioRole colegiado) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public String getRolesString() {
		return isLogged() ? getUsuario().getRolesString() : null;
	}

}
